package com.kdg.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 反射
 * Created by kong on 2018/6/5.
 */
public class ReflectTest {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException {
        //反射--允程序在运行时（注意不是编译的时候）来进行自我检查并且对内部的成员进行操作。
        //1.获取类的三种方式   --一
        Class<?> reflectTest = Class.forName("com.kdg.reflect.ReflectBean");
        //1.获取类的三种方式   --二
        Class reflectTestTwo = ReflectBean.class;
        //1.获取类的三种方式   --三
        ReflectBean reflectTest1 = new ReflectBean();
        Class reflectTestThree = reflectTest1.getClass();
        //2.创建对象
        Object o = reflectTest.newInstance();
        //3.获取反射方法并执行
        Method yell = reflectTest.getDeclaredMethod("yell", String.class);
        try {
            yell.invoke(o,"123");
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //4.获取反射属性
        try {
            Field id = reflectTest.getDeclaredField("name");
            id.setAccessible(true);   //将私有属性设置为可见
            Field[] fields = reflectTest.getFields();
            for(Field f:fields){
                System.out.println(f.getName());
            }
            id.set(o,"456");
            System.out.println(id.get(o));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

    }
}

